package com.cotasul.tela;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;

import com.cotasul.bean.CompradorBean;
import com.cotasul.bean.ItemOrcamentoBean;
import com.cotasul.bean.OrcamentoBean;
import com.cotasul.bean.ProdutoBean;
import com.cotasul.bean.TipoBean;
import com.cotasul.bean.UsuarioBean;
import com.cotasul.negocio.CompradorServico;
import com.cotasul.negocio.OrcamentoServico;
import com.cotasul.negocio.ProdutoServico;
import com.cotasul.negocio.TipoServico;
import com.cotasul.negocio.excecoes.EmailException;
import com.cotasul.negocio.interfaces.IOrcamentoServico;
import com.cotasul.negocio.interfaces.IProdutoServico;
import com.cotasul.negocio.interfaces.IServicoGenerico;
import com.cotasul.util.Ferramentas;

@ViewScoped
@ManagedBean
public class OrcamentoTela extends TelaAbstrata {

	private OrcamentoBean orcamento;

	private UsuarioBean usuario;

	private ProdutoBean produto;

	private List<ItemOrcamentoBean> itensOrcamento;

	private ItemOrcamentoBean itemOrcamento;

	private IOrcamentoServico<OrcamentoBean> orcamentoServico;

	private IProdutoServico<ProdutoBean> produtoServico;

	private TipoServico<TipoBean> tipoServico;

	private List<ProdutoBean> listaProdutos;

	private TipoBean tipo;

	private String dtEmissao;

	private String dtValidade;

	private CompradorServico<CompradorBean> compradorServico;

	@ManagedProperty(value = "#{compradorBean}")
	private CompradorBean comprador;

	private FacesMessage msg;

	public OrcamentoTela() {
		orcamentoServico = new OrcamentoServico<OrcamentoBean>();
		tipoServico = new TipoServico<TipoBean>();
		orcamento = new OrcamentoBean();
		produto = new ProdutoBean();
		itemOrcamento = new ItemOrcamentoBean();
		itensOrcamento = new ArrayList<ItemOrcamentoBean>();
		tipo = new TipoBean();
		listaProdutos = new ArrayList<ProdutoBean>();
		usuario = usuario == null ? (UsuarioBean) ((HttpSession) FacesContext
				.getCurrentInstance().getExternalContext().getSession(false))
				.getAttribute("usuario") : usuario;
		dtEmissao = Ferramentas.formataData(new Date().getTime(), "dd/MM/yy");

	}

	public void atualizaProduto() {

	}

	public void onProdSelect(SelectEvent event) {
		produto = (ProdutoBean) event.getObject();
	}

	public void validador(FacesContext fc, UIComponent ui, Object objeto) {
		String cod = objeto.toString();
		if (ui.getId().trim().equals("idProdCad")) {
			produtoServico = new ProdutoServico<ProdutoBean>();
			try {
				List<ProdutoBean> listaProdutos = new ArrayList<ProdutoBean>();
				listaProdutos = produtoServico.consultaProdutos(cod, "",
						usuario.getCodigo());
				if (listaProdutos.size() > 0) {
					if (listaProdutos.get(0) != null) {
						produto = listaProdutos.get(0);
					} else {
						((UIInput) ui).setValid(false);
						produto.setDescricao("");
						produto.setUnidadeMedida("");
					}

				} else {
					((UIInput) ui).setValid(false);
					produto.setDescricao("");
					produto.setUnidadeMedida("");
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else if (ui.getId().trim().equals("idValDt")) {
			try {
				Date valid = Ferramentas.formataData(cod, "dd/MM/yy");
				Date emissao = Ferramentas.formataData(dtEmissao, "dd/MM/yy");
				if (valid.before(emissao)) {
					((UIInput) ui).setValid(false);
					msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
							.getServico().getValor("msg_header_erro"), this
							.getServico().getValor("msg_erro_validade"));
					FacesContext.getCurrentInstance().addMessage(null, msg);
				} else {

				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

	public void adicionaItem() {
		FacesMessage msg = null;
		if (tipo.getCodigo() != 0) {
			itemOrcamento.setProduto(produto);
			itemOrcamento.setTipo(tipo);
			itemOrcamento.setValorUnitario(0.00);
			itemOrcamento.setValorTotal(0.00);
			itemOrcamento = new ItemOrcamentoBean();
			try {
				orcamento.setDataEmissao(Ferramentas.formataData(dtEmissao,
						"dd/MM/yy"));
				orcamento.setDataValidade(Ferramentas.formataData(dtValidade,
						"dd/MM/yy"));
				RequestContext
						.getCurrentInstance()
						.execute(
								"document.getElementById('formCO:idEmiDt').readOnly=true;");
			} catch (Exception e) {
				e.printStackTrace();
			}
			produto = new ProdutoBean();
//			tipo = new TipoBean();
		} else {
			msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
					.getServico().getValor("msg_header_erro"), this
					.getServico().getValor("msg_erro_adiciona_item"));
			FacesContext.getCurrentInstance().addMessage(null, msg);
		}
	}

	public void salvar() {
		FacesMessage msg2 = null;
		try {
			compradorServico = new CompradorServico<CompradorBean>();
//			CompradorBean comprador = compradorServico.buscaComprador(usuario);
			if (comprador != null) {
				if (itensOrcamento.size() > 0) {
					orcamento.setComprador(comprador);
					orcamento.setItensOrcamento(itensOrcamento);
					orcamento.setStatus("Aberto");
					orcamentoServico.salvar(orcamento);
					orcamento = new OrcamentoBean();
					itensOrcamento = new ArrayList<ItemOrcamentoBean>();
					msg = new FacesMessage(FacesMessage.SEVERITY_INFO, this
							.getServico().getValor("msg_header_sucesso"), this
							.getServico().getValor(
									"msg_sucesso_salva_orcamento"));
				} else {
					msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
							.getServico().getValor("msg_header_erro"), this
							.getServico().getValor("msg_erro_orca_sem_itens"));
				}
			}
		} catch (EmailException e1) {
			orcamento = new OrcamentoBean();
			itensOrcamento = new ArrayList<ItemOrcamentoBean>();
			msg = new FacesMessage(FacesMessage.SEVERITY_INFO, this
					.getServico().getValor("msg_header_sucesso"), this
					.getServico().getValor("msg_sucesso_salva_orcamento"));
			msg2 = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
					.getServico().getValor("msg_header_erro"), this
					.getServico().getValor("msg_erro_email"));
			FacesContext.getCurrentInstance().addMessage(null, msg2);
			e1.printStackTrace();
		} catch (Exception e2) {
			msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
					.getServico().getValor("msg_header_erro"), this
					.getServico().getValor("msg_erro_salva_orcamento"));
			e2.printStackTrace();
		}
		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public void cancelar() {
		itemOrcamento = new ItemOrcamentoBean();
		orcamento = new OrcamentoBean();
		itensOrcamento = new ArrayList<ItemOrcamentoBean>();
		produto = new ProdutoBean();
		tipo = new TipoBean();
		dtEmissao = null;
		dtValidade = null;
	}

	public List<TipoBean> getPreencheCombo() {
		try {
			return tipoServico.buscaTipos();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	@SuppressWarnings("rawtypes")
	@Override
	protected IServicoGenerico getServico() {
		return this.orcamentoServico;
	}

	public OrcamentoBean getOrcamento() {
		return orcamento;
	}

	public void setOrcamento(OrcamentoBean orcamento) {
		this.orcamento = orcamento;
	}

	public ProdutoBean getProduto() {
		return produto;
	}

	public void setProduto(ProdutoBean produto) {
		this.produto = produto;
	}

	public List<ItemOrcamentoBean> getItensOrcamento() {
		return itensOrcamento;
	}

	public void setItensOrcamento(List<ItemOrcamentoBean> itensOrcamento) {
		this.itensOrcamento = itensOrcamento;
	}

	public IOrcamentoServico<OrcamentoBean> getOrcamentoServico() {
		return orcamentoServico;
	}

	public void setOrcamentoServico(
			IOrcamentoServico<OrcamentoBean> orcamentoServico) {
		this.orcamentoServico = orcamentoServico;
	}

	public TipoServico<TipoBean> getTipoServico() {
		return tipoServico;
	}

	public void setTipoServico(TipoServico<TipoBean> tipoServico) {
		this.tipoServico = tipoServico;
	}

	public String getDtEmissao() {
		return dtEmissao;
	}

	public void setDtEmissao(String dtEmissao) {
		this.dtEmissao = dtEmissao;
	}

	public String getDtValidade() {
		return dtValidade;
	}

	public void setDtValidade(String dtValidade) {
		this.dtValidade = dtValidade;
	}

	public ItemOrcamentoBean getItemOrcamento() {
		return itemOrcamento;
	}

	public void setItenOrcamento(ItemOrcamentoBean itemOrcamento) {
		this.itemOrcamento = itemOrcamento;
	}

	public TipoBean getTipo() {
		return tipo;
	}

	public void setTipo(TipoBean tipo) {
		this.tipo = tipo;
	}

	public List<ProdutoBean> getListaProdutos() {
		return listaProdutos;
	}

	public void setListaProdutos(List<ProdutoBean> listaProdutos) {
		this.listaProdutos = listaProdutos;
	}

	public void setItemOrcamento(ItemOrcamentoBean itemOrcamento) {
		this.itemOrcamento = itemOrcamento;
	}

	public IProdutoServico<ProdutoBean> getProdutoServico() {
		return produtoServico;
	}

	public void setProdutoServico(IProdutoServico<ProdutoBean> produtoServico) {
		this.produtoServico = produtoServico;
	}

	public UsuarioBean getUsuario() {
		return usuario;
	}

	public void setUsuario(UsuarioBean usuario) {
		this.usuario = usuario;
	}

	public CompradorServico<CompradorBean> getCompradorServico() {
		return compradorServico;
	}

	public void setCompradorServico(
			CompradorServico<CompradorBean> compradorServico) {
		this.compradorServico = compradorServico;
	}

	public CompradorBean getComprador() {
		return comprador;
	}

	public void setComprador(CompradorBean comprador) {
		this.comprador = comprador;
	}

}
